home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 18 / CU Amiga Magazine's Super CD-ROM 18 (1997)(EMAP Images)(GB)[!][issue 1998-01].iso / CUCD / Online / AList / src / alsend.e < prev    next >
Encoding:
Text File  |  1997-10-20  |  4.4 KB  |  173 lines

  1. /* ALSend.e */
  2.  
  3. /* This is the program that gets all incoming messages piped through it */
  4.  
  5. /*
  6.  * Receives in a message on the standard input, parses it, and passes it on to the
  7.  *   AList server for processing.
  8.  *
  9.  * Will attempt to start AList if it can't find it's port.
  10.  *
  11.  * Note that very little would need to be done to this to make it pure.
  12.  */
  13.  
  14.  
  15. MODULE 'other/aldef'
  16.  
  17. PROC main()
  18.    DEF x
  19.  
  20.    barnacle_start()
  21.    IF (alist_replyport = NIL)
  22.       WriteF ('Major problems, dude!  I can\at even get a port open!\n')
  23.       CleanUp (20)
  24.    ENDIF
  25.  
  26.    IF (IF (arg)  THEN (arg[0]) ELSE FALSE)
  27.       arg := TrimStr (arg)
  28.       x := StrLen (arg)-1
  29.       WHILE (IF (x < 0)  THEN FALSE  ELSE (arg[x] < 33))
  30.          DEC x
  31.       ENDWHILE
  32.  
  33.       arg[x+1] := 0
  34.    ENDIF
  35.  
  36.    parse_msg(arg)    /* This is the list name, if specified */
  37.  
  38.    barnacle_end()
  39. ENDPROC
  40.  
  41.  
  42. /*
  43.  * Attempts to send the message.
  44.  */
  45. PROC parse_msg (list:PTR TO CHAR)
  46.    DEF name:PTR TO CHAR, str:PTR TO CHAR, buff:PTR TO CHAR, tmp:PTR TO CHAR, flag, tmp2
  47.  
  48.    buff := String (256)
  49.    IF (list)
  50.       StrCopy (buff, list)
  51.       list := String (EstrLen (buff))
  52.       StrCopy (list, buff)
  53.       buff[0] := 0
  54.    ENDIF
  55.    name := str := tmp := tmp2 := flag := NIL
  56.    /* Eat the command line args */
  57.    Fgets (stdin, buff, 256)
  58.  
  59.    WHILE (Fgets (stdin, buff, 256))
  60.       /* Eat preceeding spaces */
  61.       IF (flag = NIL)
  62.          tmp := TrimStr (buff)
  63.          IF (tmp[0] <> NIL)  THEN flag := 1
  64.       ENDIF
  65.       tmp := NIL
  66.  
  67.       IF (flag)
  68.          SetStr (buff, StrLen (buff))
  69.          tmp := String (StrLen (buff))
  70.          StrCopy (tmp, buff)
  71.          IF (TrimStr (tmp) = (tmp + EstrLen (tmp)))  THEN flag := 2
  72.          IF (flag = 1)
  73.             IF (StrCmp (tmp, 'To: ', 4))
  74.                list := get_addr (list, tmp + 4)
  75.                DisposeLink (tmp)
  76.                IF (list)
  77.                   tmp := InStr (list, '@')
  78.                   IF (tmp > -1)
  79.                      /* Strip off the end stuff */
  80.                      list[tmp] := 0
  81.                      SetStr (list, tmp)
  82.                   ELSE
  83.                      tmp := EstrLen (list)
  84.                      WHILE (IF (tmp > -1)  THEN (list[tmp] <> "!") ELSE FALSE)
  85.                         DEC tmp
  86.                      ENDWHILE
  87.                      IF (tmp > -1)
  88.                         /* Found one...  Fix this UUCP address... */
  89.                         StrCopy (buff, list+tmp+1)
  90.                         DisposeLink (list)
  91.                         list := String (EstrLen (buff))
  92.                         StrCopy (list, buff)
  93.                      ENDIF
  94.                   ENDIF
  95.                ENDIF
  96.                tmp := NIL
  97.             ELSEIF (StrCmp (tmp, 'From: ', 6))
  98.                name := get_addr (name, tmp + 6)
  99.             ENDIF
  100.          ENDIF
  101.  
  102.          IF (tmp)
  103.             IF (str = NIL)
  104.                str := tmp
  105.                tmp2 := tmp
  106.             ELSE
  107.                Link (tmp2, tmp)
  108.                tmp2 := tmp
  109.             ENDIF
  110.          ENDIF
  111.       ENDIF
  112.    ENDWHILE
  113.  
  114.    DisposeLink (buff)
  115.  
  116.    IF (str)
  117.       flag := put_msg (ALM_SEND, str, list, name)
  118.       DisposeLink (str)       /* Yup, this frees each link in the chain */
  119.       IF (flag)  THEN WriteF ('failed ')
  120.    ENDIF
  121.  
  122.    IF (list)  THEN DisposeLink (list)
  123.    IF (name)  THEN DisposeLink (name)
  124. ENDPROC
  125.  
  126.  
  127. PROC get_addr (tmp1, str:PTR TO CHAR)
  128.    DEF msg:PTR TO almsg
  129.  
  130.    IF (put_msg (ALM_ADDR, str))
  131.       WriteF ('Aborting send!\n')
  132.       RETURN
  133.    ENDIF
  134.  
  135.    /* Protocol says we gotta wait for a response from ALM_ADDR */
  136.    msg := WaitPort (alist_replyport)
  137.  
  138.    IF (StrLen (msg.field2))
  139.       IF (tmp1)  THEN DisposeLink (tmp1)
  140.       tmp1 := String (StrLen (msg.field2))
  141.       StrCopy (tmp1, msg.field2)
  142.    ENDIF
  143.  
  144.    /* Make sure we thank the good program... */
  145.    Remove (msg)
  146.    ReplyMsg (msg)
  147. ENDPROC tmp1
  148.  
  149.  
  150. /*
  151.  * Returns TRUE if it didn't happen.
  152.  */
  153. PROC put_msg (cmd, arg, f1=NIL, f2=NIL)
  154.    DEF x
  155.  
  156.    IF (barnacle_put_msg (NIL, cmd, arg, f1, f2))
  157.       IF (Execute ('run AList >NIL:', NIL, stdout) = NIL)
  158.          WriteF ('Can\at find AList!\n')
  159.          RETURN TRUE
  160.       ENDIF
  161.       IF (Execute ('waitforport AList', NIL, stdout) = NIL)
  162.          WriteF ('Can\at find the WaitForPort command!\n')
  163.          RETURN TRUE
  164.       ELSE  /* Wait long enough for it */
  165.          Execute ('waitforport AList', NIL, stdout)
  166.          Execute ('waitforport AList', NIL, stdout)
  167.       ENDIF
  168.       RETURN barnacle_put_msg (NIL, cmd, arg, f1, f2)
  169.    ENDIF
  170. ENDPROC FALSE
  171.  
  172.  
  173.